package com.mzl.lal4cloud.lxw4rf.service.contract.service;

import com.mzl.lal4cloud.lxw4rf.service.contract.config.ConfigStorage;
import com.mzl.lal4cloud.lxw4rf.service.contract.common.ApiUrl;
import com.mzl.lal4cloud.lxw4rf.service.contract.http.RequestExecutor;

/**
 * @author J_luo
 */
public interface DefaultService extends BaseService {


    /**
     * 获取access_token，本方法线程安全
     *
     * @return
     */
    String getAccessToken();

    /**
     * 获取access_token，本方法线程安全
     *
     * @param forceRefresh 是否强制刷新
     * @return token access token
     */
    String getAccessToken(boolean forceRefresh);

    /**
     * get 获取
     *
     * @param url        请求接口地址
     * @param queryParam 参数
     * @return 接口响应字符串 string
     */
    String get(ApiUrl url, String queryParam);

    /**
     * post 获取
     *
     * @param url      请求接口地址
     * @param postData 请求参数json值
     * @return 接口响应字符串 string
     */
    String post(ApiUrl url, String postData);


    /**
     * 执行器
     * @param <T>      the type parameter
     * @param <E>      the type parameter
     * @param executor 执行器
     * @param url      接口地址
     * @param data     参数数据
     * @return 结果 t
     */
    <T, E> T execute(RequestExecutor<T, E> executor, ApiUrl url, E data);

    /**
     * 最大重试次数.
     *
     * @param maxRetryTimes 最大重试次数
     */
    void setMaxRetryTimes(int maxRetryTimes);

    /**
     * 获取ConfigStorage 对象.
     *
     * @return WxMpConfigStorage wx mp config storage
     */
    ConfigStorage getConfigStorage();

    /**
     * 添加 configStorage 对象
     *
     * @param wxConfigProvider .
     */
    void setConfigStorage(ConfigStorage wxConfigProvider);

    /**
     * 初始化http请求对象.
     */
    void initHttp();
}
